# -*- coding:utf-8 -*-

# @Time    : 2023/5/13 02:24
# @Author  : zengwenjia
# @Email   : zengwenjia@lingxi.ai
# @File    : user_info_extract.py
# @Software: LLM_internal

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
from bot.insurance_consultant.agent.llm_agent import LLMAgent
import asyncio
from bot.insurance_renren_labels.handle_dialogue_functions import split_content,token_count,merge_result,get_conn,read_data,AsyncExecutor
from bot.insurance_renren_labels.agent.wechat import send_wechat_warning
import pandas as pd
import json
import traceback
import time
import multiprocessing
from datetime import datetime,timedelta,date

default_template = """你是一名专业的保险方面信息提取专家,你的任务是从坐席和用户电话沟通的对话记录里敏锐的捕捉用户表现出来的相关信息。你需要提取或推理用户下列信息：
--------------------------
是否本人接听
是否询问打电话目的
是否询问投保条件
是否询问保费问题
是否询问与现有保险是否冲突的问题
是否询问保障范围及保障时效问题
是否询问缴费理赔售后问题
是否询问平台身份等问题
是否询问为其他人投保
是否预约回访
是否表示在忙
是否感觉操作麻烦
是否表示稍后操作
是否表示不会操作
是否表示不需要
--------------------------
结果输出格式为json。对话记录:
--------------------------
{conversation_history}
--------------------------"""

class UserInfoExtract(LLMAgent):

    def __init__(self, conversation_history):
        if not conversation_history:
            conversation_history = []
        self.conversation_history = conversation_history

        self.prompt = default_template.format(conversation_history=self.conversation_history)
        super().__init__(self.prompt)


async def main(user_info_extract,worker_addr='http://0.0.0.0:21005',model_name="qwen_4k_14b_model1"):
    prompt=user_info_extract.prompt
    # print("prompt:{}".format(prompt))
    result = await user_info_extract.achat_qwen_llm(prompt=prompt,worker_addr=worker_addr,model_name=model_name)
    return result


def process_user(result_list,call_info):
    print(call_info.shape)
    user=call_info.reset_index(drop=True).iloc[0].to_dict()
    start_time=time.time()
    try:
        dialogue_dict = user#dict(df.iloc[i, :][['company_id', 'case_id', 'customer_id','session_id','voice_text','call_start_time']])
        print(dialogue_dict)
        if pd.isna(dialogue_dict['voice_text']):
            print(dialogue_dict['session_id'],"voice text missing...,continue")
        else:
            dialogues=split_content(dialogue_dict['voice_text'])
            print([token_count(dialogue) for dialogue in dialogues])
            results=[]
            for dialogue in dialogues:
                user_info_extract = UserInfoExtract(conversation_history=dialogue)
                result =asyncio.run(main(user_info_extract,worker_addr='http://0.0.0.0:21005',model_name="qwen_4k_14b_model1"))
                print("result:{}".format(result))
                results.append(eval(result))
            res_result=merge_result(results)
            print("res_result:{}".format(res_result))
            # res_result={'是否本人接听': '是', '是否询问打电话目的': '是', '是否询问投保条件': '否', '是否询问保费问题': '否', '是否询问与现有保险是否冲突的问题': '否', '是否询问保障范围及保障时效问题': '否', '是否询问缴费理赔售后问题': '否', '是否询问平台身份等问题': '否', '是否询问为其他人投保': '否', '是否预约回访': '是', '是否表示在忙': '否', '是否感觉操作麻烦': '否', '是否表示稍后操作': '否', '是否表示不会操作': '否', '是否表示不需要': '否'}
            dialogue_dict['res_result1']=json.dumps(res_result,ensure_ascii=False)
            dialogue_dict['res_result2']={}
            dialogue_dict['res_result3']={}
            dialogue_dict['res_result4']={}
            dialogue_dict['res_result']={}
            print("{} used time:{}".format(dialogue_dict['session_id'],time.time()-start_time))
            result_list.append(dialogue_dict)
    except Exception as e:
        print(dialogue_dict)
        traceback.print_exc()
        start_time=time.time()
        # if len(res_result)>=1:
        #     #多线程异步写入mysql
        #     loop = asyncio.get_event_loop()
        #     async_executor = AsyncExecutor()
        #     loop.run_until_complete(async_executor.main(result_list))
        #     print('exception error push_score_to_mysql used time:{}'.format(time.time()-start_time))
        # insert_data(conn,dialogue_dict)
        





if __name__ == '__main__':
    start_date = datetime.strptime(str(date.today()), '%Y-%m-%d')
    end_date = datetime.strptime('2023-08-01', '%Y-%m-%d')
    date_list = [(start_date - timedelta(days=x)).strftime('%Y-%m-%d') for x in
                 range((start_date - end_date).days + 1)]
    
    for day in date_list:
        conn=get_conn()
        data_sql='''SELECT * FROM offline_gpt.result_voice_text a
    where not exists (select * from offline_gpt.result_voice_text_result b where a.session_id = b.session_id)
    and date(call_start_time)='{}' '''.format(day)
        print(data_sql)
        df=read_data(data_sql,conn)
        # df=pd.read_csv("renren_dialogues.csv",nrows=10)
        print(df.shape)
        if df.shape[0]==0:
            continue
        content = "{} new renren label case num:{}关键信息缺失情况：\n{}".format(day, df.shape[0],
                                                               df.isnull().sum() / df.shape[0])
        send_wechat_warning(content=content, window='renren_label', level='new_renren_label_recognize')
        # for dialogue in df['voice_text']:
            # dialogue="坐席: 喂你好，请问是孟先生吗？\n用户: 喂。\n用户: 嗯，\n坐席: 诶，你好呃，我是泰康的客户经理，工号九六四六六来电呢，是看到您之前有领取过泰康的一个免费意外险吗？就是泰康二十六周年庆啊，给您的保单呢？对接成六百万的医疗全险啊？呃，我这也是带您去看一下您的保障内容和理赔服务，就耽误您几分钟会给您做个讲解好吧。\n用户: 嗯，是啊。\n用户: 嗯，\n用户: 嗯，\n坐席: 嗯，那对接之后啊，以后大小疾病，大小意外都能报进口药，自费药也都能赔，确保您的权益哈，我带您到我们的微信公众号上看一下，对您打开免提，然后回到手机的主屏幕对，然后打开微信。\n坐席: 嗯，您就打开微信了，之后跟我说一声，我带您操作，咱们看一下嗯。\n用户: 嗯，打开了。\n坐席: 嗯，您微信打开了吧。\n用户: 嗯，\n坐席: 哦，您不要挂电话，马上为您服务。\n坐席: 你好孟先生，嗯，你好，孟先生这边电话已经转接过来了，我姓李，木子，李叫李文，是咱们泰康保险这边贵宾部的工作人员啊，刚刚咱们小助理有带您打开了微信，咱们这边微信已经打开了吧。\n用户: 嗯，\n用户: 嗯，\n用户: 属于周转\n坐席: 孟先生对微信已经打开右上角有个圆圈，有个加号点一下。\n用户: 嗯，好了。\n坐席: 微信打开右上角有个圆圈，有个加号点一下，第二行有个添加朋友。\n坐席: 然后倒数第二行有一个公众号。\n用户: 嗯，\n用户: 嗯，添加朋友。\n坐席: 然后倒数第二行有个公众号。\n坐席: 然后咱们搜索一下，如果有保，就是如果有保险了，如果有保，所以说一下\n用户: 搜索啥？\n坐席: 如果有保，如果有保险了，如果有保\n坐席: 做到的话，然后点一下它的头像，关注公众号。\n坐席: 因为你之前在我们这边领取过赠险。\n坐席: 现在呢，是作为我们这边的优质客户，可以进一步完善咱们的保障。\n用户: 嗯嗯。\n坐席: 看到了吧。\n用户: 嗯，\n坐席: 嗯，\n坐席: 对，就是三险合一的一个全险，然后嗯，关注好了，右下角有两个字，我的点一下。\n用户: 我。\n坐席: 对右下角有两个字，我的\n坐席: 关注好了右下角有两个字，我的，然后第一行有个激活码。\n坐席: 如果有把它投，如果有把它头像是一个绿色的圆圈，然后里面有个像发的小出苗一样对吧。\n用户: 没有啊。\n用户: 嗯，\n坐席: 对，然后你点一下它的头像，对点一下它头像，关注公众号。\n用户: 点开哈。\n用户: 嗯，\n坐席: 嗯，然后右下角对点一下，然后第一行有一个激活码。\n用户: 嗯，我\n用户: 嗯，\n坐席: 然后您输入我的工号六五，五四八二\n用户: 嗯，\n用户: 嗯，\n用户: 六。\n坐席: 嗯，\n坐席: 六五，五四，八二\n用户: 我，我四八二\n用户: 哦。\n坐席: 对，因为您之前在咱们泰康这边领取过一个赠险赠送的一个保险，现在呢，是作为咱们这边的优质客户，可以进一步完善咱们的保障知道吧。\n用户: 嗯，\n坐席: 嗯，对，输入好了吗？\n用户: 好。\n坐席: 然后看到有一个六百万的医疗保障，那个赠险的话已经赠送你了，他说完善已经激活您的家庭保障，这个赠险的话已经赠送给您过了，然后现在的话您看一下，那有一个六百万医疗保险，就是小到猫抓狗咬烧伤烫伤。\n坐席: 大到癌症，肿瘤疾病的话都是可以保的，只要不做违法犯罪的事，住院的话都是可以保障的，除去免赔额的话，也是可以百分之百报销的。\n坐席: 然后我看您今年的话，五十四岁，您现在应该还在工作吧？孟先生\n用户: 嗯，\n用户: 有。\n坐席: 啊嗯，我说您现在应该还在工作吧。\n用户: 我没工作呀。\n坐席: 啊。\n坐席: 呃，现在在退休了，是吧。\n用户: 嗯，\n坐席: 嗯，\n坐席: 对，嗯，那您现在就没有工作，在家里面是给您家带孩子吗？\n用户: 嗯，\n坐席: 嗯，\n用户: 到处跑着玩的\n坐席: 那就跑着玩，是吧，那您现在喜不喜欢钓鱼呀。\n用户: 嗯，\n用户: 喜欢呀。\n坐席: 啊，那挺好的。\n坐席: 像我父亲的话，因为跟您年龄差不多，但是我父亲只有在他不干活的时候才能去钓鱼，因为我们我们家里的孩子比较多，还有好几个兄弟姐妹在上学，就我一个人出来工作了，知道吧。\n用户: 嗯，\n用户: 嗯，\n坐席: 所以我父亲只有在他空闲的时候才会注意钓鱼，但是他起的很早，五六点钟五点多查起来，冬天的时候那天还起码还是都起来了，然后就去就去鱼时啊，就先去下窝，就我们，我们老家话就说先下午那也是蛮好的，嗯，那您这边现在也是比较自由，那您家孩子应该都大了吧，孟先生\n用户: 哦，上班\n坐席: 嗯，\n坐席: 啊，都上班了，就一个孩子是吗？\n用户: 嗯，\n坐席: 对，那您是非常幸福的，像我父母的话，他还有就是三个孩子在上学呢，知道吧，因为我们家想个男孩就是父母压力也比较大，知道吧，孩子比较多，因为三个女儿一个儿子最后才是个男孩，所以父母压力也比较大，那像您的话就比较幸福的。\n坐席: 但是因为咱们呃，就是只有一个孩子要要养嘛，而且而且已经工作了，咱们也花不了太多钱，现在咱们主要的就是任务的话，就是把自己的身体健康给保障好，不让子女为咱们担心，您说对吧，孟先生\n用户: 嗯，嗯嗯。\n坐席: 嗯，\n坐席: 所以的话咱们今天完善这个保障呢，它是一个三险合一的，一个全险，包含了一般的疾病，重大的疾病和意外三险，合一的一个全险，就是嗯，一般疾病，您看一下下面有个保障计划，一般疾病三百万，重大疾病，六百万质质和重离子的话，也是六百万，就是就是小到猫抓狗咬，烧伤，烫伤。"
        # dialogue_dicts=[]
        # pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
        start_time1=time.time()
        pool = multiprocessing.Pool(processes=10)
        result_list = multiprocessing.Manager().list()
        for name, group in df.groupby(['session_id']):
            pool.apply_async(process_user, (result_list,group.sort_values(by='call_start_time')))
        pool.close()
        pool.join()
        print('result num :'.format(len(result_list)))
        start_time2=time.time()
        #多线程异步写入mysql
        loop = asyncio.get_event_loop()
        async_executor = AsyncExecutor()
        loop.run_until_complete(async_executor.main(result_list))
        end_time=time.time()

        content = "{} new renren label case num:{} 识别用时:{} 入库用时：{},总用时:{}".format(day, len(result_list), start_time2-start_time1,end_time - start_time2,end_time-start_time1)
        send_wechat_warning(content=content, window='renren_label', level='new_renren_label_recognize')

        print(content)

        # 关闭数据库连接
        conn.close()



    



        # dialogue_dicts.append(dialogue_dict)
    
    # pd.DataFrame(dialogue_dicts).to_csv("model1_results.csv",index=False)


    

